home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / data / maglrex / pixel.asm < prev    next >
Assembly Source File  |  1991-10-18  |  11KB  |  595 lines

  1. ;
  2. ;            'Magl.rex'     for FM-TOWNS
  3. ;
  4. ;        - MAKIchan Graphic loader is not 鮪だ! -
  5. ;
  6. ;            programmed by MALOR
  7. ;
  8.  
  9.     .386p
  10.  
  11. HeaderSize    equ    32/4
  12. Plane2    equ    0104h
  13. Plane1    equ    010ch
  14.  
  15. CODE    segment dword public use32 'CODE'
  16.     assume cs:CODE,ds:DATA
  17.  
  18. ;void start(void)
  19.     public start
  20. start    proc near
  21.  
  22.     call    load
  23.  
  24.     ret
  25.  
  26. start    endp
  27.  
  28. ;int  inpb(int addr)
  29.  
  30.     public inpb
  31.     db    'inpb',4
  32. inpb    proc near
  33.     xor    eax,eax
  34.     mov    dx,[esp+4]
  35.     in    al,dx
  36.     ret
  37. inpb    endp
  38.  
  39. ;void outpb(int addr,int dat)
  40.  
  41.     public outpb
  42.     db    'outpb',5
  43. outpb    proc near
  44.     mov    dx,[esp+4]
  45.     mov    al,[esp+8]
  46.     out    dx,al
  47.     ret
  48. outpb    endp
  49.  
  50. ;****************************************
  51. ;     mag format pixel decode 
  52. ;****************************************
  53.  
  54. ;int    mag(char *maghead,int mode,int offset,int xpixel);
  55.  
  56. flgdec    macro    flg_bit                ;flag decode macro
  57.     local    Then
  58.     local    Endif
  59.  
  60.     rol    dl,1
  61.     jnc    short Then
  62.     lodsb                    ;read flag b to al
  63.                         ;flag b pointer(esi) incliment
  64.     jmp    short Endif
  65.     align    4
  66. Then:    xor    al,al                ;write 0 to flag
  67. Endif:    stosb                    ;write al to es:[edi]
  68.                         ;flag pointer(edi) incliment
  69.     endm
  70.  
  71.     public mag
  72.     db    'mag',3
  73.     align    4
  74. mag    proc    near
  75.  
  76.     pushad                    ;汎用レジスタ全部push
  77.  
  78.     mov    eax,ss:[esp+36+4]        ;mode
  79.     mov    ds:[Mode],eax
  80.     mov    eax,ss:[esp+36+8]        ;VRAMオフセット
  81.     mov    ds:[Vofs],eax
  82.     mov    eax,ss:[esp+36+12]        ;横方向のループ回数
  83.     mov    ds:[Xloopc],ax
  84.  
  85.     mov    esi,ss:[esp+36+0]        ;ヘッダをコピー
  86.  
  87.     cld                    ;メモリ転送はインクリメント方向
  88.  
  89.     push    es
  90.     mov    ax,ds                ;dsをesにコピー
  91.     mov    es,ax
  92.  
  93.     mov    edi,offset Header
  94.     mov    ecx,HeaderSize
  95.     rep movsd
  96.  
  97. ;flag a,b decode
  98.  
  99.     mov    ebp,ds:[flga]            ;*ebp=flga
  100.     mov    esi,ds:[flgb]            ;*esi=flgb
  101.     mov    edi,ds:[flg ]            ;*edi=flg
  102.  
  103.     movzx    edx,ds:[RY]            ;Y方向のループ回数セット
  104.     sub    dx,ds:[LY]
  105.     inc    edx
  106.     mov    ds:[YLoopc],dx            ;ワークにセット
  107.     movzx    eax,ds:[XLoopc]            ;X方向のループ回数セット
  108.     mul    edx                ;eax = eax * edx;edx broken
  109.     mov    ebx,eax
  110.     mov    ecx,eax                ;Loop counter (ecx) set
  111.     shr    ecx,3                ;ecx = ecx / 8
  112.  
  113.     jz    LOOP2_Exit
  114.  
  115.     align    4
  116.  
  117. LOOP2:    mov    dl,ds:[ebp]
  118.     flgdec                    ;展開じゃ展開じゃ!
  119.     flgdec
  120.     flgdec
  121.     flgdec
  122.     flgdec
  123.     flgdec
  124.     flgdec
  125.     flgdec
  126.     inc    ebp
  127.     dec    ecx
  128.     jnz    LOOP2
  129.  
  130. LOOP2_Exit:
  131.     mov    dl,ds:[ebp]
  132.     and    ebx,7h
  133.     jmp    ds:[ebx*4+Jtable2]
  134.  
  135.     align    4
  136.  
  137. jt27:    flgdec
  138. jt26:    flgdec
  139. jt25:    flgdec
  140. jt24:    flgdec
  141. jt23:    flgdec
  142. jt22:    flgdec
  143. jt21:    flgdec
  144. jt20:    
  145.  
  146. ; 1 line xor
  147.  
  148.     mov    esi,ds:[flg]            ;esi = 1ライン上のポインタ
  149.     mov    edi,esi                ;edi = フラグのポインタ
  150.     movzx    ecx,ds:[XLoopc]            ;ecx = *XLoopc
  151.     add    edi,ecx                ;edi = esi + *XLoopc
  152.     movzx    eax,ds:[RY]
  153.     sub    ax,ds:[LY]            ;eax = ry - ly
  154.     mul    ecx                ;eax *= ecx    ;edx broken
  155.     mov    ecx,eax                ;ecx = Loop counter
  156.     mov    ebx,eax
  157.     shr    ecx,2
  158.  
  159.     jz    LOOP1_Exit
  160.  
  161.     align    4
  162.  
  163. LOOP1:    lodsd
  164.     xor    ds:[edi],eax
  165.     add    edi,4
  166.     loop    LOOP1
  167.  
  168. LOOP1_Exit:
  169.     and    ebx,3
  170.     jmp    ds:[ebx*4+Jtable1]
  171.  
  172.     align    4
  173.  
  174. jt13:    lodsb
  175.     xor    ds:[edi],al
  176.     inc    edi
  177. jt12:    lodsb
  178.     xor    ds:[edi],al
  179.     inc    edi
  180. jt11:    lodsb
  181.     xor    ds:[edi],al
  182. jt10:
  183.  
  184.     movzx    ecx,ds:[LX]            ;左端のVRAMオフセット計算
  185.     mov    bl,ds:[Screen]
  186.     and    bl,80h
  187.     jnz    short ThenA
  188.     shr    ecx,3
  189.     shl    ecx,2                ;ecx = (ecx/8)*4
  190.     jmp    short EndifA
  191. ThenA:    shr    ecx,2
  192.     shl    ecx,2                ;ecx = (ecx/4)*4
  193. EndifA:    add    ds:[Vofs],ecx            ;水平方向誤差修正
  194.     mov    eax,ds:[Lineofs]
  195.     movzx    ecx,ds:[LY]
  196.     mul    ecx                ;eax = LY * Lineofs ;edx broken
  197.     add    ds:[Vofs],eax            ;垂直方向誤差修正
  198.     mov    edi,ds:[Vofs]            ;edi = VRAMのポインタ
  199.  
  200.     mov    ax,Plane1
  201.     mov    bl,ds:[Screen]
  202.     and    bl,80h
  203.     jnz    Mode8                ;256色展開
  204.  
  205. ;pixel decode (16色モード)
  206.  
  207. Mode4:    mov    ax,Plane2
  208.     mov    es,ax                ;VRAMセレクタセット
  209.  
  210.     xor    ebx,ebx                ;関係レジスタ初期化
  211.     xor    edx,edx
  212.  
  213.     mov    esi,ds:[flg]            ;esi = フラグのポインタ
  214.     mov    ebp,ds:[pix]            ;ebp = ピクセルのポインタ
  215.  
  216.     mov    ax,ds:[YLoopc]            ;Y方向のループ回数セット
  217.     shl    eax,16                ;Y loop counter=eaxの上位16bit
  218.  
  219.     align    4
  220.  
  221. LOOPY2:    mov    cx,ds:[XLoopc]            ;cx set
  222.  
  223.     ;左ピクセル展開
  224.  
  225.     align    4
  226.  
  227. LOOPX2:    mov    dl,ds:[esi]            ;flag read
  228.     shr    dl,4
  229.     jz    short Then3
  230.     mov    ebx,ds:[edx*4+Mofs]        ;前方参照
  231.     mov    ax,es:[edi+ebx]            ;VRAM read to ax
  232.     jmp    short Endif3
  233.  
  234.     align    4
  235.  
  236. Then3:    mov    ax,ds:[ebp]            ;pixel read to ax
  237.     add    ebp,2
  238.     ror    al,4                ;上位下位4ビット交換
  239.     ror    ah,4
  240. Endif3:    stosw                    ;VRAM write from ax
  241.                         ;VRAM pointer(edi) incliment
  242.  
  243.     ;右ピクセル展開
  244.  
  245.     mov    dl,ds:[esi]            ;flag read
  246.     and    dl,0fh
  247.     jz    short Then4
  248.     mov    ebx,ds:[edx*4+Mofs]        ;前方参照
  249.     mov    ax,es:[edi+ebx]            ;VRAM read to ax
  250.     jmp    short Endif4
  251.  
  252.     align    4
  253.  
  254. Then4:    mov    ax,ds:[ebp]            ;pixel read to ax
  255.     add    ebp,2                ;pixel incliment
  256.     ror    al,4                ;上位下位4ビット交換
  257.     ror    ah,4
  258. Endif4:    stosw                    ;VRAM write from ax
  259.                         ;VRAM pointer(edi) incliment
  260.  
  261.     inc    esi                ;Flag incliment
  262.     loop    LOOPX2
  263.  
  264.     mov    edi,ds:[Vofs]            ;ediに1ライン分のオフセット加算
  265.     add    edi,ds:[Lineofs]
  266.     mov    ds:[Vofs],edi
  267.  
  268.     xor    ax,ax                ;ax clear for eax decliment
  269.     sub    eax,10000h
  270.  
  271.     jnz    LOOPY2
  272.  
  273.     jmp    Exit
  274.  
  275. ;pixel decode (256色モード)
  276.  
  277. Mode8:    mov    es,ax                ;VRAMセレクタセット
  278.  
  279.     xor    eax,eax                ;関係レジスタ初期化
  280.     xor    ebx,ebx
  281.     xor    edx,edx
  282.  
  283.     mov    ebp,ds:[flg]            ;ebp = フラグのポインタ
  284.     mov    esi,ds:[pix]            ;esi = ピクセルのポインタ
  285.  
  286.     mov    dx,ds:[YLoopc]            ;Y方向のループ回数セット
  287.                         ;Y loop counter=dx
  288.  
  289.     align    4
  290.  
  291. LOOPY3:    mov    cx,ds:[XLoopc]            ;cx set
  292.  
  293.     ;左ピクセル展開
  294.  
  295.     align    4
  296.  
  297. LOOPX3:    mov    al,ds:[ebp]            ;flag read
  298.     shr    al,4
  299.     jz    short Then5
  300.     mov    ebx,ds:[eax*4+Mofs]        ;前方参照
  301.     mov    ax,es:[edi+ebx]            ;VRAM read to ax
  302.     jmp    short Endif5
  303.  
  304.     align    4
  305.  
  306. Then5:    lodsw                    ;pixel read to ax
  307.                         ;pixel pointer(esi) incliment
  308. Endif5:    stosw                    ;VRAM write from ax
  309.                         ;VRAM pointer(edi) incliment
  310.     xor    eax,eax
  311.  
  312.     ;右ピクセル展開
  313.  
  314.     mov    al,ds:[ebp]            ;flag read
  315.     and    al,0fh
  316.     jz    short Then6
  317.     mov    ebx,ds:[eax*4+Mofs]        ;前方参照
  318.     mov    ax,es:[edi+ebx]            ;VRAM read to ax
  319.     jmp    short Endif6
  320.  
  321.     align    4
  322.  
  323. Then6:    lodsw                    ;pixel read to ax
  324.                         ;pixel pointer(esi) incliment
  325. Endif6:    stosw                    ;VRAM write from ax
  326.                         ;VRAM pointer(edi) incliment
  327.     xor    eax,eax
  328.  
  329.     inc    ebp                ;Flag incliment
  330.     loop    LOOPX3
  331.  
  332.     mov    edi,ds:[Vofs]            ;ediに1ライン分のオフセット加算
  333.     add    edi,ds:[Lineofs]
  334.     mov    ds:[Vofs],edi
  335.     sub    dx,1
  336.     jnz    LOOPY3
  337.  
  338. Exit:    pop    es
  339.  
  340.     popad                    ;汎用レジスタ全部pop
  341.  
  342.     ret
  343.  
  344. mag    endp
  345.  
  346. ;****************************************
  347. ;     maki format pixel decode 
  348. ;****************************************
  349.  
  350. mkiflg    macro
  351.     local    Endif1
  352.     local    Endif2
  353.  
  354.     rol    dl,1                ;Carry Flagに抽出
  355.     jnc    short Endif1            ;CF == 0 : jmp Endif
  356.     lodsw                    ;Read from flag b to ax
  357.                         ;flag b pointer(esi)incliment
  358.     mov    bx,ax
  359.     and    ax,0f0f0h
  360.     shl    bx,4
  361.     and    bx,0f0f0h
  362.     mov    ds:[edi],al            ;write to Flag
  363.     mov    ds:[edi+40],bl
  364.     mov    ds:[edi+80],ah
  365.     mov    ds:[edi+120],bh
  366. Endif1:    rol    dl,1
  367.     jnc    short Endif2
  368.     lodsw
  369.     mov    bx,ax
  370.     shr    ax,4
  371.     and    ax,0f0fh
  372.     and    bx,0f0fh
  373.     or    ds:[edi],al
  374.     or    ds:[edi+40],bl
  375.     or    ds:[edi+80],ah
  376.     or    ds:[edi+120],bh
  377. Endif2:    inc    edi
  378.     endm
  379.  
  380. mkipix    macro
  381.     local    Then
  382.     local    Endif
  383.  
  384.     rol    dl,1                ;Carry flagに抽出
  385.     jc    short Then            ;CF == 1 : jmp Then
  386.     xor    al,al                ;write 0 to pix
  387.     jmp    short Endif
  388.  
  389.     align    4
  390.  
  391. Then:    lodsb                    ;read from pix to al
  392.                         ;pix pointer(esi) incliment
  393.     ror    al,4                ;上位下位交換
  394. Endif:    stosb                    ;write al to VRAM(es:[edi])
  395.     endm
  396.  
  397. ;int mki(char *mkihead,int mode,int offset);
  398.     public mki
  399.     db    'mki',3
  400.     align    4
  401. mki    proc near
  402.  
  403.     pushad
  404.  
  405.     mov    eax,ss:[esp+36+4]        ;mode
  406.     mov    ds:[Mode],eax
  407.     mov    eax,ss:[esp+36+8]        ;VRAMオフセット
  408.     mov    ds:[Vofs],eax
  409.     mov    eax,ss:[esp+36+0]        ;ヘッダ先頭アドレス
  410.     mov    ds:[SizA],eax            ;SizAが代わりのワーク
  411.  
  412.     cld                    ;flag clear
  413.     mov    ecx,4000
  414.     mov    edi,ds:[flg]
  415.     xor    eax,eax
  416.     rep stosd
  417.  
  418.     ;flag a,b decode
  419.  
  420.     mov    ecx,100                ;ecx = Y loop counter
  421.     mov    edi,ds:[flg]            ;edi = flag pointer
  422.     mov    esi,ds:[flgb]            ;esi = flag b pointer
  423.     mov    ebp,ds:[flga]            ;ebp = flag a pointer
  424.  
  425.     align    4
  426.  
  427. LOOPY5:    mov    dh,10                ;dh = X loop counter
  428.  
  429.     align    4
  430.  
  431. LOOPX5:    mov    dl,ds:[ebp]            ;dl = flag a
  432.     mkiflg
  433.     mkiflg
  434.     mkiflg
  435.     mkiflg
  436.     inc    ebp                ;flag a pointer(ebp) incliment
  437.     dec    dh                ;X loop counter decliment
  438.     jnz    LOOPX5
  439.     add    edi,40*3            ;1 line offset
  440.     sub    ecx,1                ;Y loop counter decliment
  441.     jnz    LOOPY5
  442.  
  443.     ;pixel decode
  444.  
  445.     ;1024*512画面モード
  446.  
  447.     align    4
  448.  
  449. Pix1:    mov    ax,Plane2            ;VRAM selecter set to es
  450.     mov    es,ax
  451.     mov    edi,ds:[Vofs]            ;es:[edi] = VRAM pointer
  452.     mov    esi,ds:[pix]            ;esi = pix pointer
  453.     mov    ebp,ds:[flg]            ;ebp = Flag pointer
  454.     xor    eax,eax                ;eax clear
  455.     mov    ebx,400                ;Y loop counter = ebx
  456.  
  457.     align    4
  458.  
  459. LOOPY6:    mov    ecx,40
  460.  
  461.     align    4
  462.  
  463. LOOPX6:    mov    dl,ds:[ebp]
  464.     mkipix
  465.     mkipix
  466.     mkipix
  467.     mkipix
  468.     mkipix
  469.     mkipix
  470.     mkipix
  471.     mkipix
  472.     inc    ebp
  473.     dec    ecx
  474.     jnz    LOOPX6
  475.     add    edi,192
  476.     dec    ebx
  477.     jnz    LOOPY6
  478.  
  479.     mov    esi,ds:[Vofs]            ; 1 Line Xor
  480.     mov    edi,esi
  481.  
  482.     mov    eax,ds:[SizA]
  483.     mov    al,ds:[eax+6]
  484.     cmp    al,'A'
  485.     je    Then9
  486.     cmp    al,'B'
  487.     jne    Exit2
  488.  
  489.     add    edi,512*4            ; 4 Line 毎
  490.     mov    ebx,396
  491.     jmp    Endif9
  492. Then9:    add    edi,512*2            ; 2 Line 毎
  493.     mov    ebx,398
  494. Endif9:    
  495.  
  496.     align    4
  497.  
  498. LOOPY7:    mov    ecx,80
  499.  
  500.     align    4
  501.  
  502. LOOPX7:    mov    eax,es:[esi]
  503.     xor    es:[edi],eax
  504.     add    esi,4
  505.     add    edi,4
  506.     loop    LOOPX7
  507.     add    esi,192
  508.     add    edi,192
  509.     dec    ebx
  510.     jnz    LOOPY7
  511.  
  512. Exit2:    mov    ax,ds
  513.     mov    es,ax
  514.  
  515.     popad
  516.  
  517.     ret
  518.  
  519. mki    endp
  520.  
  521. CODE    ends
  522.  
  523. DATA    segment dword
  524.     assume ds:DATA
  525.  
  526.     align    4
  527.     ;前方参照オフセットアドレステーブル
  528. Mofs    dd    -(512*0+0),-(512*0+2),-(512*0+4),-(512*0+8)
  529.     dd    -(512*1+0),-(512*1+2)
  530.     dd    -(512*2+0),-(512*2+2),-(512*2+4)
  531.     dd    -(512*4+0),-(512*4+2),-(512*4+4)
  532.     dd    -(512*8+0),-(512*8+2),-(512*8+4)
  533.     dd    -(512*16+0)
  534.  
  535.     ;1ライン分のオフセット
  536. Lineofs    dd    512
  537.  
  538.     align    4
  539.  
  540. ; header
  541. Header    db    0    ;ヘッダの先頭
  542. Machine    db    0    ;機種コード
  543. Rflg    db    0    ;機種依存フラグ
  544. Screen    db    0    ;スクリーンモード
  545. LX    dw    0    ;表示開始位置X
  546. LY    dw    0    ;表示開始位置Y
  547. RX    dw    639    ;表示終了位置X
  548. RY    dw    399    ;表示終了位置Y
  549. OffA    dd    0    ;フラグAのオフセット
  550. OffB    dd    0    ;フラグBのオフセット
  551. SizB    dd    0    ;フラグBのサイズ
  552. OffP    dd    0    ;ピクセルのオフセット
  553. SizP    dd    0    ;ピクセルのサイズ
  554.  
  555. ;Other work
  556.  
  557. SizA    dd    0    ;フラグAのサイズ
  558.  
  559. ;Temporary work
  560.  
  561. XLoopc    dw    0    ;X方向のループ回数
  562. YLoopc    dw    0    ;Y方向のループ回数
  563. Vofs    dd    0    ;展開領域の左端のVRAMオフセット
  564. Mode    dd    4    ;画面モード == 4 : 16色1024*512モード
  565.             ;        == 8 : 256色1024*512モード
  566.             ;        == 1 : DOS互換640*400モード
  567. Sofs    dd    0    ;展開元領域の左端オフセット
  568. Slofs    dd    0    ;
  569. Vlofs    dd    0    ;
  570.  
  571. ;Table
  572.  
  573.     align    4
  574.     ;xorループの出口のジャンプテーブル
  575.  
  576. Jtable1    dd    offset jt10,offset jt11, offset jt12,offset jt13
  577.  
  578.     ;flag decode ループの出口のジャンプテーブル
  579. Jtable2    dd    offset jt20,offset jt21,offset jt22,offset jt23
  580.     dd    offset jt24,offset jt25,offset jt26,offset jt27
  581.  
  582. DATA    ends
  583.  
  584.     public Mofs
  585.     public Lineofs
  586.     extrn flga:dword
  587.     extrn flgb:dword
  588.     extrn flg:dword
  589.     extrn pix:dword
  590.     extrn vram:dword
  591.     extrn screen_mode:byte
  592.     extrn load:near
  593.  
  594.     end    start
  595.